package com.yvan.cs.process;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.yvan.cs.Consts;
import com.yvan.cs.platform.Conv;
import com.yvan.cs.platform.JsonWapper;
import com.yvan.cs.utils.util;
import lombok.val;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class TableProcess {

    public static void process(final JsonWapper jwTable) {

        if (jwTable == null)
            return;

        Set<String> imports = Sets.newLinkedHashSet();
        List<String> pkColumn = Lists.newArrayList();

        for (val c : jwTable.asJsonWapperList("Column")) {

            //如下是列的定义
            //JsonWapper c = jwTable.asDic("Column", key);
            //JsonWapper c = new JsonWapper(map);
            val javaName = c.asStr(Consts.COLUMN_JAVA_NAME);

            if (Strings.isNullOrEmpty(javaName)) {
                if (Strings.isNullOrEmpty(c.asStr(Consts.COLUMN_DB))) {
                    throw new RuntimeException("db和property 不能同时为空!");
                }
                c.set(Consts.COLUMN_JAVA_NAME, util.hump(c.asStr(Consts.COLUMN_DB)));
            }

            //没有定义 json , 默认定义个json
            if (Strings.isNullOrEmpty(c.asStr(Consts.COLUMN_JSON))) {
                if (Strings.isNullOrEmpty(c.asStr(Consts.COLUMN_DB))) {
                    c.set(Consts.COLUMN_JSON, util.line(javaName));
                } else {
                    c.set(Consts.COLUMN_JSON, c.asStr(Consts.COLUMN_DB));
                }
            }

            //如果 json 是 n 代表不需要序列化
            if (Consts.COLUMN_JSON_N.equals(c.get(Consts.COLUMN_JSON))) {
                c.set(Consts.COLUMN_JSON, null);
            }


            val javaType = c.asStr(Consts.COLUMN_JAVA_TYPE);
            if (Consts.COLUMN_JAVA_TYPE_STRING.equals(javaType) || Strings.isNullOrEmpty(javaType)) {
                imports.add("import java.lang.String;");

            } else if (Consts.COLUMN_JAVA_TYPE_DATETIME.equals(javaType)) {
                imports.add("import org.joda.time.DateTime;");

            } else if (Consts.COLUMN_JAVA_TYPE_BIG_DECIMAL.equals(javaType)) {
                imports.add("import java.math.BigDecimal;");

            } else if (Consts.COLUMN_JAVA_TYPE_BOOLEAN.equals(javaType)) {
                imports.add("import java.lang.Boolean;");

            } else if (Consts.COLUMN_JAVA_TYPE_LONG.equals(javaType)) {
                imports.add("import java.lang.Long;");

            } else if (Consts.COLUMN_JAVA_TYPE_INTEGER.equals(javaType)) {
                imports.add("import java.lang.Integer;");

            } else if (Consts.COLUMN_JAVA_TYPE_SHORT.equals(javaType)) {
                imports.add("import java.lang.Short;");

            } else if (Consts.COLUMN_JAVA_TYPE_DOUBLE.equals(javaType)) {
                imports.add("import java.lang.Double;");

            } else {
                throw new RuntimeException("unknown javaType:" + javaType);

            }

            val dbAn = c.asStr(Consts.COLUMN_DB_AN);
            if (Consts.COLUMN_DB_AN_P.equals(dbAn)) {
                c.set(Consts.COLUMN_DB_AN, "TableId");
                pkColumn.add(javaName);

            } else if (Strings.isNullOrEmpty(dbAn) || Consts.COLUMN_DB_AN_Y.equals(dbAn)) {
                c.set(Consts.COLUMN_DB_AN, "TableField");

            } else if (Consts.COLUMN_DB_AN_N.equals(dbAn) || Strings.isNullOrEmpty(c.asStr(Consts.COLUMN_DB))) {
                c.set(Consts.COLUMN_DB_AN, "");

            } else {
                throw new RuntimeException("unknown dbAn:" + dbAn);

            }

            jwTable.set(Consts.TABLE_COLUMNS, javaName, c.getInnerMap());
        }

        jwTable.getInnerMap().remove("Column");
        jwTable.set(Consts.TABLE_PK, pkColumn.stream().map(k -> jwTable.asMap(Consts.TABLE_COLUMNS, k)).toArray());
        jwTable.set(Consts.TABLE_ENTITY, Consts.TABLE_ENTITY_IMPORTS, imports);
    }
}
